package com.ljx.List;

import com.ljx.Dynamic.ListNode;

/**
 * @author 李加喜
 * @Package com.ljx.List
 * @date 2021-11-18 10:21
 */
public class FuanZhuanKZu {
    public static void main(String[] args) {

    }
    /**
     * 反转以k为节点的链表
     */
    ListNode reverse(ListNode a){
        ListNode pre,cur,next;
        pre=null;cur=a;next=a;
        while (cur!=null){
            next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
        return pre;
    }
    /**
     * 反转期间[a,b)
     */
    ListNode reverseAB(ListNode a,ListNode b){
        ListNode pre,cur,next;
        pre=null;cur=a;next=a;
        while (cur!=b){
            next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
        return pre;
    }
    /**
     * 反转k个一组的链表
     */
    ListNode reverseKGroup(ListNode head,int k){
        //在[a,b)这个区间之间包含了k个需要反转的数据
        if (head==null ){
            return null;
        }
        ListNode a=head,b=head;
        for (int i=0;i<k;i++){
            // 不足k个不需要反转
            if (b==null){
                // 以为k后面存在空值  所有不到k个数据
                return head;
            }
            b=b.next;
        }
        //反转前k个数据
        ListNode newList=reverseAB(a,b);
        a.next=reverseKGroup(b,k);
        return newList;
    }
}
